package br.com.sistema.smallAgro.daoImpl;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.NoResultException;
import javax.persistence.Query;
import javax.transaction.Transactional;

import org.springframework.stereotype.Repository;

import br.com.sistema.smallAgro.base.DAOBase;
import br.com.sistema.smallAgro.dao.ClienteDao;
import br.com.sistema.smallAgro.enums.SimNao;
import br.com.sistema.smallAgro.modelo.Cliente;

@Repository("clienteDao")
public class ClienteDaoImpl extends DAOBase<Cliente> implements ClienteDao {

	@Override
	public boolean buscaCliente(Cliente cliente) {
		StringBuilder sb = new StringBuilder();
		sb.append("SELECT c FROM Cliente c");
		sb.append(" WHERE c.nome = :nome AND c.status = :status");

		Query query = getEntityManager().createQuery(sb.toString());

		query.setParameter("nome", cliente.getNome());
		query.setParameter("status", SimNao.S);

		try {
			return (Boolean) query.getSingleResult();
		} catch (NoResultException e) {
			e.printStackTrace();
			return false;
		}

	}

	@Override
	@Transactional
	public void salvar(Cliente cliente) {
		if (cliente.getCodigo() != null) {
			getEntityManager().merge(cliente);
		} else {
			getEntityManager().persist(cliente);
		}
	}

	@Override
	public void excluir(Cliente cliente) {

	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Cliente> consultaPaginada(Serializable filtro, long inicio,
			long fim) {
		Map<String, Object> parametros = new HashMap<String, Object>();

		StringBuilder hql = new StringBuilder();

		criaQueryConsultaPaginada((Cliente) filtro, parametros, hql, false);

		Query query = getEntityManager().createQuery(hql.toString());

		for (String parametro : parametros.keySet()) {
			query.setParameter(parametro, parametros.get(parametro));
		}

		query.setFirstResult((int) inicio);
		query.setMaxResults((int) fim);

		return query.getResultList();
	}

	@Override
	public long total(Serializable filtro) {
		Map<String, Object> parametros = new HashMap<String, Object>();

		StringBuilder hql = new StringBuilder();

		criaQueryConsultaPaginada((Cliente) filtro, parametros, hql, true);

		Query query = getEntityManager().createQuery(hql.toString());

		for (String parametro : parametros.keySet()) {
			query.setParameter(parametro, parametros.get(parametro));
		}

		return (Long) query.getSingleResult();
	}

	private void criaQueryConsultaPaginada(Cliente filtro,
			Map<String, Object> parametros, StringBuilder hql, boolean isCount) {

		if (isCount) {
			hql.append("SELECT COUNT(c) FROM Cliente c");
		} else {
			hql.append("SELECT c FROM Cliente c");
		}
		hql.append(" WHERE 1 = 1");

		if (filtro.getNome() != null) {
			hql.append(" AND c.nome = :nomeCliente");
			parametros.put("nomeCliente", filtro.getNome());
		}

		if (filtro.getStatus() != null) {
			hql.append(" AND c.status = :status");
			parametros.put("status", filtro.getStatus());
		}
	}

	@Override
	public boolean buscaClienteValidacao(Cliente cliente) {
		StringBuilder sb = new StringBuilder();
		sb.append(" SELECT COUNT(c.codigo) FROM Cliente c ");
		sb.append(" WHERE c.nome = :nome ");

		Query q = getEntityManager().createQuery(sb.toString());
		q.setParameter("nome", cliente.getNome());

		long valor = ((Long) q.getSingleResult()).longValue();

		if (valor >= 1) {
			return true;
		} else {
			return false;
		}
	}

}
